# @Time    : 2021-03-15 9:32
# @Author  : Jackcongx
# @FileName: wx_method.py.py
# @Software: PyCharm


# -*- encoding:utf-8 -*-
import json
import logging
import os
from io import BytesIO
from PIL import Image
import random
import string
import time
import uuid
import requests
from django.conf import settings

from utils import redis_client_db1

logger = logging.getLogger(__name__)
error_logger = logging.getLogger("error")
requests.packages.urllib3.disable_warnings()
app_id = settings.WX_APP_ID
secret = settings.WX_SECRET
grant_type = "client_credential"




def get_token():
    """
    获取微信access_token;
    access_token有效期为2小时,redis缓存,定时更新;
    """

    wx_token_key = 'WX_ACCESS_TOKEN'  # 缓存token
    token = redis_client_db1.get(wx_token_key)
    if token:
        return True, token
    else:
        token_url = "https://api.weixin.qq.com/cgi-bin/token"
        payload = {
            "appid": app_id,
            "secret": secret,
            "grant_type": grant_type
        }
        res = requests.get(token_url, params=payload)
        resp = json.loads(res.text)
        error_logger.info('access_token_resp:{}'.format(resp))
        if resp.get('access_token'):
            redis_client_db1.set(wx_token_key, resp['access_token'], resp['expires_in']-60)
            return True, resp['access_token']
        return False, resp


def create_noncestr():
    '''
    生成签名的随机串
    '''
    # return uuid.uuid1()
    return ''.join(random.sample(string.ascii_letters + string.digits, 8))


def create_timestamp():
    '''
    生成签名的时间戳
    '''
    return str(int(time.time()))


def get_jsapi_ticket(access_token):
    '''
    获取jsapi_ticket;
    jsapi_ticket是公众号用于调用微信JS接口的临时票据;
    '''

    url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket'
    payload = {
        "access_token": access_token,
        "type": "jsapi"
    }
    res = requests.get(url, params=payload)
    res_result = json.loads(res.text)
    error_logger.info('jsapi_ticket_resp:{}'.format(res_result))
    if res_result["errcode"] == 0:
        return True, res_result['ticket']

    return False, res_result


def wx_check_content(content):
    """
        接入微信内容审核接口
    """

    ok, access_token = get_token()
    if not ok:
        return 2000, "获取access_token失败"

    # 需要提交的参数
    params = {'access_token': access_token}

    headers = {
        'Content-Type': 'application/json'
    }

    data = '{"content": "' + content + '"}'

    # 微信文本审核地址
    url = 'https://api.weixin.qq.com/wxa/msg_sec_check'
    # 提交到微信地址
    _result = requests.post(url, params=params, headers=headers, data=data.encode("utf-8"), timeout=3, verify=False)
    if _result.status_code != 200:
        return 1000, "文本校验接口访问失败，请稍后再试"
    json_result: dict = json.loads(_result.content)
    errcode = json_result.get("errcode")
    errmsg = json_result.get("errmsg")
    if errcode == 0:
        return 0, ""
    else:
        return 1000, "发布内容不合法，请修改后再发布"


def create_qrcode(file_name='', scene='', page='', width=280, is_hyaline=False, auto_color=False):
    '''
    二维码生成的参数信息
    :param scene: 最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符
    :param page:已经发布的小程序存在的页面（否则报错），例如 pages/index/index, 根路径前不要填加 /,不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
    :param width: 二维码的宽度，默认为 430px，最小 280px，最大 1280px
    :param is_hyaline: 是否需要透明底色，为 true 时，生成透明底色的小程序码，默认 false
    :param auto_color: 自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调，默认 false
    :return:
    '''

    # 保存的文件的路径
    file_path = "static/qrcode/wxcode_%s.png" % file_name
    #file_path = "/root/bbs_work/ayc_bbs/static/qrcode/wxcode_%s.png" % file_name

    # 先判断本地文件是否已经存在
    if os.path.exists(file_path):
        # 直接的返回图片的地址
        return 0, file_path

    # 需要添加到二维码的地址后面的授权码
    ok, access_token = get_token()
    if not ok:
        return 2000, "获取access_token失败"

    # 需要提交的参数
    params = {'access_token': access_token}

    headers = {
        'Content-Type': 'application/json'
    }

    # json数据值
    json_data = {"scene": scene,
                 "page": page,
                 "width": width,
                 "auto_color": auto_color,
                 "is_hyaline": is_hyaline
                 }
    # 生成二维码地址
    url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit'
    # 提交到微信地址
    _result = requests.post(url, params=params, headers=headers, json=json_data, timeout=3, verify=False)

    if _result.status_code == 502 or _result.status_code == 500:
        return 1000, '服务器内部错误'

    if _result.status_code >= 400 and _result.status_code <= 499:
        return 1000, '语法格式有误,服务器无法理解此请求'

    # 判断返回的内容类型 如果是返回的 JSON 数据包
    if 'json' in _result.headers.get('content-type'):
        # 返回微信的错误描述信息
        #return 1000, _result.json().get('errmsg')
        return 1000, '请求微信失败,请稍后再试'

    # 否则说明 请成功 以请求返回的二进制数据创建一张图片
    img = Image.open(BytesIO(_result.content))

    # 保存文件
    img.save(file_path, "png")  # 保存图像为gif格式

    return 0, file_path
